package com.sky.sky_pojo.entity;

import java.math.BigDecimal;
import java.time.LocalDateTime;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;



/**
 * <p>
 * // 设置订单状态为"待付款":
orders.setStatus(Orders.OrderStatus.PENDING_PAYMENT.getCode());
</p><p>
// 设置支付方式为"微信":
orders.setPayMethod(Orders.PayMethod.WECHAT.getCode());
</p><p>
// 获取支付状态描述:
String payStatusDesc = Orders.PayStatus.getDescByCode(orders.getPayStatus());</p>
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Orders{

    /**
     * 主键（数据库自增）
     */
    private Long id;
    
    /**
     * 订单号（唯一标识一笔订单）
     */
    private String number;
    
    /**
     * 订单状态（使用OrderStatus枚举中的值）
     */
    private Integer status;
    
    /**
     * 下单用户ID，关联用户表
     */
    private Long userId;
    
    /**
     * 地址ID，关联地址表
     */
    private Long addressBookId;
    
    /**
     * 下单时间，用户提交订单的时间
     */
    private LocalDateTime orderTime;
    
    /**
     * 结账时间，用户完成支付的时间
     */
    private LocalDateTime checkoutTime;
    
    /**
     * 支付方式（使用PayMethod枚举中的值）
     */
    private Integer payMethod;
    
    /**
     * 支付状态（使用PayStatus枚举中的值）
     */
    private Integer payStatus;
    
    /**
     * 实收金额，订单实际支付的总金额
     */
    private BigDecimal amount;
    
    /**
     * 备注，用户对订单的特殊说明或要求
     */
    private String remark;
    
    /**
     * 手机号，收货人的联系电话
     */
    private String phone;
    
    /**
     * 地址，详细的收货地址
     */
    private String address;
    
    /**
     * 用户名称，下单用户的昵称或姓名
     */
    private String userName;
    
    /**
     * 收货人，接收商品的人员姓名
     */
    private String consignee;
    
    /**
     * 订单取消原因，当订单状态为已取消时填写
     */
    private String cancelReason;
    
    /**
     * 订单拒绝原因，当商家拒绝订单时填写
     */
    private String rejectionReason;
    
    /**
     * 订单取消时间，订单被取消的具体时间
     */
    private LocalDateTime cancelTime;
    
    /**
     * 预计送达时间，系统或商家预估的商品送达时间
     */
    private LocalDateTime estimatedDeliveryTime;
    
    /**
     * 配送状态（1：立即送出，0：选择具体时间）
     */
    private Integer deliveryStatus;
    
    /**
     * 送达时间，商品实际送达的时间
     */
    private LocalDateTime deliveryTime;
    
    /**
     * 打包费，订单的包装费用
     */
    private Integer packAmount;
    
    /**
     * 餐具数量，用户需要的餐具份数
     */
    private Integer tablewareNumber;
    
    /**
     * 餐具数量状态（1：按餐量提供，0：选择具体数量）
     */
    private Integer tablewareStatus;

    /**
     * 订单状态枚举
     */
    public enum OrderStatus {
        /**
         * 待付款：用户已提交订单但尚未完成支付
         */
        PENDING_PAYMENT(1, "待付款"),
        /**
         * 待接单：用户已支付，商家尚未接受订单
         */
        PENDING_RECEIVE(2, "待接单"),
        /**
         * 已接单：商家已接受订单，准备处理
         */
        RECEIVED(3, "已接单"),
        /**
         * 派送中：订单已出餐，正在配送过程中
         */
        DELIVERING(4, "派送中"),
        /**
         * 已完成：用户已收到商品，订单完成
         */
        COMPLETED(5, "已完成"),
        /**
         * 已取消：订单被用户或系统取消
         */
        CANCELLED(6, "已取消"),
        /**
         * 退款：订单已完成退款流程
         */
        REFUNDED(7, "退款");

        private final Integer code;
        private final String desc;

        OrderStatus(Integer code, String desc) {
            this.code = code;
            this.desc = desc;
        }

        public Integer getCode() {
            return code;
        }

        public String getDesc() {
            return desc;
        }

        /**
         * 根据状态码获取描述
         */
        public static String getDescByCode(Integer code) {
            for (OrderStatus status : values()) {
                if (status.code.equals(code)) {
                    return status.desc;
                }
            }
            return "";
        }
    }

    /**
     * 支付方式枚举
     */
    public enum PayMethod {
        /**
         * 微信支付：用户选择通过微信完成支付
         */
        WECHAT(1, "微信"),
        /**
         * 支付宝支付：用户选择通过支付宝完成支付
         */
        ALIPAY(2, "支付宝");

        private final Integer code;
        private final String desc;

        PayMethod(Integer code, String desc) {
            this.code = code;
            this.desc = desc;
        }

        public Integer getCode() {
            return code;
        }

        public String getDesc() {
            return desc;
        }
    }

    /**
     * 支付状态枚举
     */
    public enum PayStatus {
        /**
         * 未支付：订单已创建但用户尚未完成支付
         */
        UNPAID(0, "未支付"),
        /**
         * 已支付：用户已成功完成支付流程
         */
        PAID(1, "已支付"),
        /**
         * 退款：订单已完成退款处理
         */
        REFUNDED(2, "退款");

        private final Integer code;
        private final String desc;

        PayStatus(Integer code, String desc) {
            this.code = code;
            this.desc = desc;
        }

        public Integer getCode() {
            return code;
        }

        public String getDesc() {
            return desc;
        }
        
        /**
         * 根据状态码获取描述
         */
        public static String getDescByCode(Integer code) {
            for (PayStatus status : values()) {
                if (status.code.equals(code)) {
                    return status.desc;
                }
            }
            return "";
        }
    }
}